﻿Imports System.Data
Imports System.Configuration
Imports System.Collections.Generic
Imports System.Data.SqlClient
Imports TepcelDominio
Imports TepcelDAL.DBManager

Public Class NotaAlmacenDAL : Inherits DBManager
    Public Function NuevoNotaAlmacen(ByRef notaAlmacen As NotaAlmacen) As Integer
        Dim comando As SqlCommand
        Dim i As Integer
        Dim j As Integer
        'Insertar Nota Almacén
        comando = MyBase.CreateSelectCommand("SPInsertNotaAlmacen")
        comando.Parameters.Add("@codigoNotaAlmacen", SqlDbType.Int).Value = notaAlmacen.codigoNotaAlmacen
        comando.Parameters.Add("@tipoNotaAlmacen", SqlDbType.Char, 1).Value = notaAlmacen.tipoNotaAlmacen
        comando.Parameters.Add("@numeroNotaAlmacen", SqlDbType.Char, 8).Value = notaAlmacen.numeroNotaAlmacen
        comando.Parameters.Add("@fechaEmision", SqlDbType.DateTime).Value = notaAlmacen.fechaEmision
        comando.Parameters.Add("@origenEntrada", SqlDbType.VarChar, 200).Value = notaAlmacen.origenEntrada
        comando.Parameters.Add("@destinoSalida", SqlDbType.VarChar, 200).Value = notaAlmacen.destinoSalida
        comando.Parameters.Add("@descripcionNota", SqlDbType.VarChar, 200).Value = notaAlmacen.descripcionNota
        comando.Parameters.Add("@codigoAlmacen", SqlDbType.Char, 4).Value = notaAlmacen.Almacen.codigoAlmacen
        comando.Parameters.Add("@codigoUsuario", SqlDbType.Char, 4).Value = notaAlmacen.codigoUsuario
        comando.Parameters.Add("@estadoNotaAlmacen", SqlDbType.Char, 1).Value = notaAlmacen.estadoNotaAlmacen

        comando.Parameters("@codigoNotaAlmacen").Direction = ParameterDirection.InputOutput
        comando.Parameters("@numeroNotaAlmacen").Direction = ParameterDirection.InputOutput
        If MyBase.ExecuteQuery(comando) > 0 Then
            notaAlmacen.codigoNotaAlmacen = comando.Parameters("@codigoNotaAlmacen").Value
            notaAlmacen.numeroNotaAlmacen = comando.Parameters("@numeroNotaAlmacen").Value
            'Insertar Detalle Nota
            For i = 0 To notaAlmacen.DetalleAlmacen.Count - 1
                comando = MyBase.CreateSelectCommand("SPInsertDetalleNotaAlmacen")
                comando.Parameters.Add("codigoProducto", SqlDbType.Char, 4).Value = notaAlmacen.DetalleAlmacen(i).Producto.codigoProducto
                comando.Parameters.Add("codigoNotaAlmacen", SqlDbType.Int).Value = notaAlmacen.codigoNotaAlmacen
                comando.Parameters.Add("cantidadNotaAlmacen", SqlDbType.Int).Value = notaAlmacen.DetalleAlmacen(i).cantidadNotaAlmacen
                comando.Parameters.Add("@codigoAlmacen", SqlDbType.Char, 4).Value = notaAlmacen.Almacen.codigoAlmacen
                comando.Parameters.Add("@tipoNotaAlmacen", SqlDbType.Char, 1).Value = notaAlmacen.tipoNotaAlmacen

                If MyBase.ExecuteQuery(comando) > 0 Then
                    For j = 0 To notaAlmacen.DetalleAlmacen(i).Series.Count - 1
                        If notaAlmacen.DetalleAlmacen(i).Series(j).DetalleExistencia.codigoDetalleExistencia = 0 Then
                            'Insertar Existencia
                            comando = MyBase.CreateSelectCommand("SPInsertarDetalleExistencia")
                            comando.Parameters.Add("@codigoDetalleExistencia", SqlDbType.Int).Value = 0
                            comando.Parameters.Add("@serieProducto", SqlDbType.VarChar, 20).Value = notaAlmacen.DetalleAlmacen(i).Series(j).DetalleExistencia.serieProducto
                            comando.Parameters.Add("@estadoProducto", SqlDbType.Char, 1).Value = "B"
                            comando.Parameters.Add("@codigoProducto", SqlDbType.Char, 4).Value = notaAlmacen.DetalleAlmacen(i).Producto.codigoProducto
                            comando.Parameters.Add("@codigoAlmacen", SqlDbType.Char, 4).Value = notaAlmacen.Almacen.codigoAlmacen

                            comando.Parameters("@codigoDetalleExistencia").Direction = ParameterDirection.InputOutput

                            If MyBase.ExecuteQuery(comando) > 0 Then
                                notaAlmacen.DetalleAlmacen(i).Series(j).DetalleExistencia.codigoDetalleExistencia = comando.Parameters("@codigoDetalleExistencia").Value
                            End If

                        End If
                        'Insertar series
                        If notaAlmacen.DetalleAlmacen(i).Series(j).DetalleExistencia.codigoDetalleExistencia > 0 Then
                            comando = MyBase.CreateSelectCommand("SPInsertSeriesNota")

                            comando.Parameters.Add("@codigoProducto", SqlDbType.Char, 4).Value = notaAlmacen.DetalleAlmacen(i).Producto.codigoProducto
                            comando.Parameters.Add("codigoNotaAlmacen", SqlDbType.Int).Value = notaAlmacen.codigoNotaAlmacen
                            comando.Parameters.Add("@codigoDetalleExistencia", SqlDbType.Int).Value = notaAlmacen.DetalleAlmacen(i).Series(j).DetalleExistencia.codigoDetalleExistencia

                            If MyBase.ExecuteQuery(comando) > 0 Then
                                'si hay falla rollback

                            End If
                        End If

                    Next
                End If
            Next
        End If

        Return notaAlmacen.codigoNotaAlmacen

    End Function

    Public Function GetByIdFromNotaAlmacen(ByVal codigoNotaAlmacen As Integer) As NotaAlmacen
        Dim comando As SqlCommand = MyBase.CreateSelectCommand("GetByIdFromNotaAlmacen")
        comando.Parameters.Add("@codigoNotaAlmacen", SqlDbType.Int).Value = codigoNotaAlmacen
        Return SelectObjectFactory(comando).Item(0)
    End Function
    Public Function GetAllFromNotaAlmacen() As List(Of NotaAlmacen)
        Dim comando As SqlCommand = MyBase.CreateSelectCommand("GetAllFromNotaAlmacen")
        Return SelectObjectFactory(comando)
    End Function

    Private Function SelectObjectFactory(ByVal comando As SqlCommand) As List(Of NotaAlmacen)
        Dim Lista As New List(Of NotaAlmacen)
        Dim cmddetale As SqlCommand
        Dim cmdseries As SqlCommand
        Dim tNotaAlmacen As New DataTable
        tNotaAlmacen.TableName = "NotaAlmacen"
        tNotaAlmacen.Load(MyBase.ExecuteReader(comando))
        For Each Fila As DataRow In tNotaAlmacen.Rows
            Dim NotaAlmacen As New NotaAlmacen()
            With NotaAlmacen
                .codigoNotaAlmacen = Fila.Item(0)
                .tipoNotaAlmacen = Fila.Item(1)
                .numeroNotaAlmacen = Fila.Item(2)
                .fechaEmision = Fila.Item(3)
                .origenEntrada = Fila.Item(4)
                .destinoSalida = Fila.Item(5)
                .descripcionNota = Fila.Item(6)
                .Almacen.codigoAlmacen = Fila.Item(7)
                .codigoUsuario = Fila.Item(8)
                .estadoNotaAlmacen = Fila.Item(9)
                .Almacen.serieAlmacen = Fila.Item(10)

                'buscamos el detalle correspondiente a esta nota
                cmddetale = MyBase.CreateSelectCommand("GetByIdFromDetalleNotaAlmacen")
                cmddetale.Parameters.Add("@codigoNotaAlmacen", SqlDbType.Int).Value = .codigoNotaAlmacen
                Dim tDetalleNotaAlmacen As New DataTable
                tDetalleNotaAlmacen.TableName = "DetalleNotaAlmacen"
                tDetalleNotaAlmacen.Load(MyBase.ExecuteReader(cmddetale))
                For Each FilaD As DataRow In tDetalleNotaAlmacen.Rows
                    Dim DetalleNota As New NotaAlmacen.DetalleNotaAlmacen
                    DetalleNota.Producto.codigoProducto = FilaD.Item(1)
                    DetalleNota.cantidadNotaAlmacen = FilaD.Item(2)
                    DetalleNota.Producto.Categoria.codigoCategoria = FilaD.Item(3)
                    DetalleNota.Producto.nombreProducto = FilaD.Item(4)
                    DetalleNota.Producto.descripcionProducto = FilaD.Item(5)
                    NotaAlmacen.DetalleAlmacen.Add(DetalleNota)

                    'buscamos las series para este detalle
                    cmdseries = MyBase.CreateSelectCommand("GetByIdFromSeriesNotaAlmacen")
                    cmdseries.Parameters.Add("@codigoNotaAlmacen", SqlDbType.Int).Value = .codigoNotaAlmacen
                    cmdseries.Parameters.Add("@codigoProducto", SqlDbType.Char, 4).Value = DetalleNota.Producto.codigoProducto
                    Dim tSeriesNotaAlmacen As New DataTable
                    tSeriesNotaAlmacen.TableName = "SeriesNotaAlmacen"
                    tSeriesNotaAlmacen.Load(MyBase.ExecuteReader(cmdseries))
                    For Each FilaS As DataRow In tSeriesNotaAlmacen.Rows
                        Dim SeriesNota As New NotaAlmacen.DetalleNotaAlmacen.SerieProductoNotaAlmacen
                        SeriesNota.DetalleExistencia.codigoDetalleExistencia = FilaS.Item(0)
                        SeriesNota.DetalleExistencia.serieProducto = FilaS.Item(1)
                        SeriesNota.DetalleExistencia.estadoProducto = FilaS.Item(2)
                        SeriesNota.DetalleExistencia.estadoProductoAlmacen = FilaS.Item(3)
                        NotaAlmacen.DetalleAlmacen(NotaAlmacen.DetalleAlmacen.Count - 1).Series.Add(SeriesNota)
                        SeriesNota = Nothing
                    Next
                Next
            End With
            Lista.Add(NotaAlmacen)
            NotaAlmacen = Nothing
        Next

      
        Return Lista
    End Function
End Class
